//
//  CZRefreshControl.swift
//  Weibo27
//
//  Created by apple on 16/4/22.
//  Copyright © 2016年 itcast. All rights reserved.
//

import UIKit

enum CZRefreshControlType: Int{
    // 正常状态
    case Normal = 0
    // 松手刷新
    case Pulling = 1
    // 刷新中
    case Refreshing = 2
}

// 刷新控件的高度
private let RefreshHeight: CGFloat = 50

class CZRefreshControl: UIControl {
    
    var czState:CZRefreshControlType = .Normal{
        didSet{
            switch czState{
            case .Normal:
                messageLabel.text = "正常状态"
                
                // 我们上一个状态为Refreshing 在执行动画
                if oldValue == .Refreshing{
                    UIView.animateWithDuration(0.25, animations: { () -> Void in
                        self.scrollView?.contentInset.top -= RefreshHeight
                    })
                }
                
                
            case .Pulling:
                messageLabel.text = "松手刷新"
            case .Refreshing:
                messageLabel.text = "刷新中"
                // 设置动画 增加scrollView?.contentInset.top  50的高度
                UIView.animateWithDuration(0.25, animations: { () -> Void in
                    self.scrollView?.contentInset.top += RefreshHeight
                    }, completion: { (_) -> Void in
                        // 告知外界要刷新了
                        self.sendActionsForControlEvents(UIControlEvents.ValueChanged)
                })
            }
        }
    }
    
    // scrollView
    var scrollView: UIScrollView?

    override init(frame: CGRect) {
        super.init(frame: frame)
        setupUI()
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    // MARK: - 供外界调用停止刷新
    func endRefreshing(){
        czState = .Normal
    }
    
    // MARK: - 设置视图
    private func setupUI(){
        
        self.backgroundColor = RGB(red: 55, green: 105, blue: 65)

        addSubview(messageLabel)
        
    
    }
    override func layoutSubviews() {
        super.layoutSubviews()
        // 设置当前控件的frame
        self.frame = CGRect(x: 0, y: -RefreshHeight, width: SCREENW, height: RefreshHeight)
        // 设置messageLabel 的fram
        messageLabel.frame = CGRect(x: 0, y: 0, width: SCREENW, height: RefreshHeight)
    }
    
    // 通过该方法监听 期添加到谁身上了
    override func willMoveToSuperview(newSuperview: UIView?) {
      // print(newSuperview)
        // 判断父控件是否存在 且是否是 UIScrollView
        if let scrollView = newSuperview as? UIScrollView{
            //scrollView.contentOffset.
            // 通过kvo 监听我们父控件的属性改变
            // 如果我们想监听一个对象身上的属性的该表 可以通过KVO
            // 通知属于 1对多
            // KVO 属于1对1
            self.scrollView = scrollView
            scrollView.addObserver(self, forKeyPath: "contentOffset", options: NSKeyValueObservingOptions.New, context: nil)
            
        }
    }
    // 监听我们那个对象的属性发生改变
//    - 正常状态 (没有松手)  contentOffset.y > -114   && 当前状态为pulling
//    - 松手刷新 (没有松手)  contentOffset.y <= -114  && 当前状态为normal
//    - 刷新中(已经松手)
//    - 上一个状态 松手刷新
//    - 必须还松手
    override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {
        // 获得scrollView?.contentOffset.y\
        // 获得临界值
        let contentMargin = -(RefreshHeight + scrollView!.contentInset.top)
        //let
        let contentOffsetY = scrollView?.contentOffset.y
        // 通过dragging 来判断我们是否在拖动scrollView
            // - true 代表拖动中
            // - false 代表没有拖动
        // 代表拖动中
        if scrollView!.dragging{
            if contentOffsetY > contentMargin && czState == .Pulling{
                czState = .Normal
            }else if contentOffsetY <= contentMargin && czState == .Normal{
                czState = .Pulling
            }
        }else{
            // 代表停止拖动(只有我们停止了拖动 && 我们当前的状态为Pulling)
            if czState == .Pulling{
                czState = .Refreshing
            }
            
        }
        
    }
    
    // MARK: - 懒加载控件
    private lazy var messageLabel: UILabel = {
        let lab = UILabel()
        lab.font = UIFont.systemFontOfSize(14)
        lab.text = "正常状态"
        lab.textAlignment = .Center
        lab.textColor = UIColor.whiteColor()
        return lab
    }()
    
    // KVO 需要程序员自己手动移除
    deinit{
        self.scrollView?.removeObserver(self, forKeyPath: "contentOffset")
    }
    
    

}
